home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 016a / mdosp401.zip / APPLCTX.ASM next >
Assembly Source File  |  1991-01-11  |  5KB  |  251 lines

  1. ;----------------------------------------------------------
  2. ;
  3. ;   Sample TSR to demonstrate application specific task
  4. ;   context save and restore routines.
  5. ;
  6. ;   This TSR must be installed after MultiDos Plus is
  7. ;   executed and before any other application task is
  8. ;   started.  Use the following MultiDos Plus commands
  9. ;   to install this program:
  10. ;
  11. ;      LC
  12. ;      ND
  13. ;      XQ
  14. ;      APPLCTX
  15. ;
  16. ;
  17. ;   One of the context choices is to save/restore the 10
  18. ;   interrupt vectors used by Microsoft C's floating point
  19. ;   emulator.  If a task was written in Microsoft C and
  20. ;   uses floating point, use the following sequence to
  21. ;   load and execute the program.
  22. ;
  23. ;     RM xxx
  24. ;     MISCFLAG 2                 indicates must save context
  25. ;     other pre-load commands
  26. ;     YOURPROG                   load your application program
  27. ;
  28. ;   The MISCFLAG 2 command informs the context routines
  29. ;   contained in this (APPLCTX) module that the interrupt
  30. ;   vectors used by the Microsoft 8087 emulator are to be
  31. ;   saved and restored for the task.  Please note that this
  32. ;   is only required if more than one task uses a floating
  33. ;   point emulator.  Only tasks which use the floating point
  34. ;   emulator need to use the MISCFLAG 2 command.
  35. ;
  36. ;
  37. ;----------------------------------------------------------
  38. ;
  39. ;   Copyright (c) 1990
  40. ;           by
  41. ;     Nanosoft Inc.
  42. ;   13 Westfield Road
  43. ;   Natick, MA  01760
  44. ;
  45. ;-----------------------------------------------------------
  46. .MODEL    LARGE
  47. .286
  48. ;
  49.     NAME    APPLCTX
  50.  
  51. MISCFLG        EQU    200    ;misc. flag word
  52. TCBTSKNM    EQU    220    ;task number
  53.  
  54.  
  55. ;------------------------------------------------------
  56. ;
  57. ;  start of the code segment
  58. ;
  59. ;------------------------------------------------------
  60.  
  61. _TEXT    SEGMENT    BYTE PUBLIC 'CODE'
  62.     ASSUME    CS:_TEXT
  63.  
  64.     assume    ds:NOTHING,ES:NOTHING,SS:NOTHING
  65. ;
  66.     db    'Copyright (c) 1990 Nanosoft Inc.'
  67.  
  68. MAXTASKS    EQU    12    ; ALLOW ONLY FOR MULTIDOS PLUS DEFAULT
  69.  
  70. SVDATA87    DB    128 * MAXTASKS DUP(0)
  71.  
  72. SVINTMS        DB    64 * MAXTASKS DUP(0)
  73.  
  74. ;-----------------------------------------------------
  75. ;
  76. ;  CONTEXT SAVE ENTRY POINT
  77. ;    ENTRY:
  78. ;    BX = OFFSET OF TCB
  79. ;    ES = SEGMENT OF TCB
  80. ;    EXIT:
  81. ;    ALL REGISTERS MUST BE PRESERVED
  82. ;
  83. ;-----------------------------------------------------
  84.  
  85. CTXSAVE    PROC    FAR
  86.     PUSH    AX
  87.     PUSH    BX
  88.     PUSH    CX
  89.     PUSH    DX
  90.     PUSH    DI
  91.     PUSH    SI
  92.     PUSH    DS
  93.     PUSH    ES
  94. ;
  95.     TEST    WORD PTR ES:[BX+MISCFLG],100H    ; SAVE 8087?
  96.     JZ    CTXSN100
  97. ;
  98. ; SAVE 8087 CONTEXT FOR THIS TASK
  99. ;
  100.     MOV    SI,ES:[BX+TCBTSKNM]    ;GET TASK NUMBER
  101.     SHL    SI,7            ; * 128
  102.     ADD    SI,OFFSET SVDATA87    ; ADD IN BASE OF CONTEXT SAVE TABLE
  103.     FNSAVE    CS:[SI]
  104.     FWAIT
  105. ;
  106. CTXSN100:
  107.     TEST    WORD PTR ES:[BX+MISCFLG],200H    ;SAVE EMULATOR INT?
  108.     JZ    CTXSN200
  109. ;
  110. ; SAVE INT 34 - 3D INTERRUPT VECTORS FOR MICROSOFT FP EMULATOR
  111. ;
  112.     PUSH    ES
  113.     MOV    DI,ES:[BX+TCBTSKNM]    ;GET TASK NUMBER
  114.     SHL    DI,6            ; * 64
  115.     ADD    DI,OFFSET SVINTMS    ; ADD IN BASE OF CONTEXT SAVE TABLE
  116.     PUSH    CS
  117.     POP    ES            ; DESTINATION IN CODE SEGMENT
  118.     MOV    AX,0            ; SOURCE IN SEGMENT 0
  119.     MOV    DS,AX
  120.     MOV    SI,34H*4        ;
  121.     CLD
  122.     MOV    CX,20            ; COPY 20 WORDS (10 VECTORS)
  123.     REP    MOVSW
  124.     POP    ES
  125. ;
  126. CTXSN200:
  127. ;
  128. CTXSNO:
  129.     POP    ES
  130.     POP    DS
  131.     POP    SI
  132.     POP    DI
  133.     POP    DX
  134.     POP    CX
  135.     POP    BX
  136.     POP    AX
  137.     RET
  138. ;
  139. CTXSAVE    ENDP
  140.  
  141. ;----------------------------------------------------------
  142. ;  Restore context routine
  143. ;----------------------------------------------------------
  144.  
  145. CTXRSTR    PROC    FAR
  146.     PUSH    AX
  147.     PUSH    BX
  148.     PUSH    CX
  149.     PUSH    DX
  150.     PUSH    DI
  151.     PUSH    SI
  152.     PUSH    DS
  153.     PUSH    ES
  154.  
  155. ;
  156.     TEST    WORD PTR ES:[BX+MISCFLG],100H    ; SAVE 8087?
  157.     JZ    CTXRN100
  158. ;
  159. ; SAVE 8087 CONTEXT FOR THIS TASK
  160. ;
  161.     MOV    SI,ES:[BX+TCBTSKNM]    ;GET TASK NUMBER
  162.     SHL    SI,7            ; * 128
  163.     ADD    SI,OFFSET SVDATA87    ; ADD IN BASE OF CONTEXT SAVE TABLE
  164.     FRSTOR    CS:[SI]
  165.     FWAIT
  166. ;
  167. CTXRN100:
  168.     TEST    WORD PTR ES:[BX+MISCFLG],200H    ;RESTORE EMULATOR INT?
  169.     JZ    CTXRN200
  170. ;
  171. ; RESTORE INT 34 - 3D INTERRUPT VECTORS FOR MICROSOFT FP EMULATOR
  172. ;
  173.     PUSH    ES
  174.     MOV    SI,ES:[BX+TCBTSKNM]    ;GET TASK NUMBER
  175.     SHL    SI,6            ; * 64
  176.     ADD    SI,OFFSET SVINTMS    ; ADD IN BASE OF CONTEXT SAVE TABLE
  177.     PUSH    CS
  178.     POP    DS            ; DESTINATION IN CODE SEGMENT
  179.     MOV    AX,0            ; SOURCE IN SEGMENT 0
  180.     MOV    ES,AX
  181.     MOV    DI,34H*4        ;
  182.     CLD
  183.     MOV    CX,20            ; COPY 20 WORDS (10 VECTORS)
  184.     REP    MOVSW
  185.     POP    ES
  186. ;
  187. CTXRN200:
  188. ;
  189. CTXRNO:
  190.     POP    ES
  191.     POP    DS
  192.     POP    SI
  193.     POP    DI
  194.     POP    DX
  195.     POP    CX
  196.     POP    BX
  197.     POP    AX
  198.     RET
  199. CTXRSTR    ENDP
  200.  
  201. lastlbl    dw    0
  202.  
  203. ;---------------------------------------------------------
  204. ;
  205. ;   INITIALIZATION CODE TO INSTALL THIS PROGRAM AS A TSR
  206. ;
  207. ;---------------------------------------------------------
  208. savds    dw    0
  209. saves    dw    0
  210. ;
  211.     PUBLIC    TSRINIT
  212. TSRINIT    PROC    FAR
  213.     MOV    CS:SAVDS,DS
  214.     MOV    CS:SAVES,ES
  215.  
  216.     MOV    AX,1E08H    ;FUNCTION AND SUBFUNCTION CODES
  217.     PUSH    CS
  218.     POP    DX
  219.     MOV    BX,OFFSET CTXSAVE    ;OFFSET OF CONTEXT SAVE ROUTINE
  220.     MOV    CX,OFFSET CTXRSTR    ;OFFSET OF CONTEXT RESTORE ROUTINE
  221.     INT    15H            ;CALL MULTIDOS PLUS API
  222. ;
  223. ; COMPUTE THE END OF WHAT WE WANT TO STAY RESIDENT AND DO A DOS TSR
  224. ;
  225.     MOV    AX,offset lastlbl
  226.     SAR    AX,1
  227.     SAR    AX,1
  228.     SAR    AX,1
  229.     SAR    AX,1
  230.     MOV    DX,AX
  231.     MOV    AX,seg lastlbl
  232.     ADD    DX,AX
  233.     MOV    AX,cs:savds    ;get psp
  234.     SUB    DX,AX
  235.     INC    DX
  236.     MOV    AX,3100H    ;EXIT AND STAY RESIDENT
  237.     INT    21H
  238. ;
  239. TSRINIT    ENDP
  240.  
  241. ;--------------------------------------------------------
  242.  
  243. _TEXT    ENDS
  244.  
  245. _stack    segment    stack
  246.     db    500 dup(0)
  247. _stack    ends
  248.  
  249.     END    TSRINIT
  250.  
  251.